package co.gov.medellin.ssti.sub.web.action;

import java.io.IOException;
import java.util.Collection;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.beans.factory.annotation.Autowired;

import co.gov.medellin.ssti.sub.common.excepcion.SUBException;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.service.RepBeneficioOtorgadoService;
import co.gov.medellin.ssti.sub.model.service.RepDetCruceService;
import co.gov.medellin.ssti.sub.model.service.SubprogramaService;
import co.gov.medellin.ssti.sub.model.vo.BeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.ProgramaVO;
import co.gov.medellin.ssti.sub.model.vo.RepDetCruceVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

public class ReportDetCruceAction extends Action {
	@Autowired
	RepBeneficioOtorgadoService repBeneficioOtorgadoServiceImpl;
	@Autowired
	RepDetCruceService repDetCruceServiceImpl;
	@Autowired
	SubprogramaService subprogramaServiceImpl;

	/**
	 * This is the main action called from the Struts framework.
	 * 
	 * @param mapping
	 *            The ActionMapping used to select this instance.
	 * @param form
	 *            The optional ActionForm bean for this request.
	 * @param request
	 *            The HTTP Request we are processing.
	 * @param response
	 *            The HTTP Response we are processing.
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {

		String codePrograma = (String) request.getParameter("codePrograma");
		String codeDestino = (String) request.getParameter("codeDestino");
		String codeSubprograma = (String) request
				.getParameter("codeSubPrograma");
		String codeSubDestino = (String) request.getParameter("codeSubDestino");
		String fechaInicial = (String) request.getParameter("fechaInicial");
		String fechaFinal = (String) request.getParameter("fechaFinal");
		String inclusion = (String) request.getParameter("inclusion");
		String accion = (String) request.getParameter("acciones");

		HttpSession session = request.getSession();
		UserVO user = (UserVO) session.getAttribute("userInfo");
		session.removeAttribute("msg");
		session.setAttribute("msg", "");
		Collection<ProgramaVO> programasF = null;
		Collection<SubprogramaVO> subprogramasF = null;
		Collection<ProgramaVO> programasD = null;
		Collection<SubprogramaVO> subprogramasD = null;
		session.removeAttribute("Beneficiario");
		session.removeAttribute("errorfecha");

		try {
			programasF = repBeneficioOtorgadoServiceImpl
					.findProgramaByUserReport(user.getCode(),
							user.getUserGroupName(), user.getCodeArea());
		} catch (DAOException e) {
			SUBException.logDebugError("", e);
		}
		session.removeAttribute("msg");
		if (programasF.size() > 0) {
			session.setAttribute("programasF", programasF);
		} else {
			session.setAttribute("msg",
					"No se encontraron programas vigentes a la fecha..");
		}

		if (codePrograma != null) {
			if (!codePrograma.equals("nulo")) {
				try {
					SubprogramaVO vo = new SubprogramaVO();
					vo.setCode(Long.valueOf(codePrograma));
					subprogramasF = subprogramaServiceImpl
							.findAllowedSubprograma(vo, user.getCode(),
									user.getUserGroupName(), user.getCodeArea());
					// subprogramasF = repBeneficioOtorgadoServiceImpl
					// .findSubProgramaByUserReport(user.getCode(),
					// user.getUserGroupName(), codePrograma,
					// user.getCodeArea());
					programasD = repBeneficioOtorgadoServiceImpl
							.findProgramaByUserReport(user.getCode(),
									user.getUserGroupName(), user.getCodeArea());
				} catch (DAOException e) {
					SUBException.logDebugError("", e);
				}
				session.removeAttribute("msg");
				if (subprogramasF.size() > 0) {
					session.setAttribute("subprogramasF", subprogramasF);
				} else {
					session.setAttribute(
							"msg",
							"No se encontraron subprogramas asociados a este programa fuente que esten vigentes..");
				}

				if (programasD.size() > 0) {
					session.setAttribute("programasD", programasD);
				} else {
					session.setAttribute("msg",
							"No se encontraron programas vigentes a la fecha..");
				}
			} else {
				session.setAttribute("msg", "");
				session.removeAttribute("subprogramasF");
			}
		}

		if (codeDestino != null) {
			if (!codeDestino.equals("nulo")) {
				try {
					SubprogramaVO vo = new SubprogramaVO();
					vo.setCode(Long.valueOf(codeDestino));
					subprogramasD = subprogramaServiceImpl
							.findAllowedSubprograma(vo, user.getCode(),
									user.getUserGroupName(), user.getCodeArea());
					// subprogramasD = repBeneficioOtorgadoServiceImpl
					// .findSubProgramaByUserReport(user.getCode(),
					// user.getUserGroupName(), codeDestino,
					// user.getCodeArea());
				} catch (DAOException e) {
					SUBException.logDebugError("", e);
				}
				session.removeAttribute("msg");
				if (subprogramasD.size() > 0) {
					session.setAttribute("subprogramasD", subprogramasD);
				} else {
					session.setAttribute(
							"msg",
							"No se encontraron subprogramas asociados a este programa destino que esten vigentes..");
				}
			} else {
				session.setAttribute("msg", "");
				session.removeAttribute("subprogramasD");
			}
		}

		session.removeAttribute("beneficiosFuente");
		if (accion != null && accion.equals("BuscarTodo")) {
			List<BeneficiarioVO> beneficiariosCruce = null;
			try {
				RepDetCruceVO objDetCruceVO = new RepDetCruceVO();

				if (codePrograma != null && !codePrograma.equals("nulo")) {
					objDetCruceVO.setCodeProgramaFuente(new Long(
							(String) codePrograma));
				}
				if (codeSubprograma != null && !codeSubprograma.equals("nulo")) {
					objDetCruceVO.setCodeSubprogramaFuente(new Long(
							(String) codeSubprograma));
				}
				if (codeDestino != null && !codeDestino.equals("nulo")) {
					objDetCruceVO.setCodeProgramaDestino(new Long(
							(String) codeDestino));
				}
				if (codeSubDestino != null && !codeSubDestino.equals("nulo")) {
					objDetCruceVO.setCodeSubprogramaDestino(new Long(
							(String) codeSubDestino));
				}
				if (fechaInicial != null && !fechaInicial.equals("")) {
					objDetCruceVO.setDesde(fechaInicial);
				}
				if (fechaFinal != null && !fechaFinal.equals("")) {
					objDetCruceVO.setHasta(fechaFinal);
				}
				objDetCruceVO.setInclusion(inclusion);

				beneficiariosCruce = (List<BeneficiarioVO>) repDetCruceServiceImpl
						.findBeneficiariosCruce(objDetCruceVO);

				if (beneficiariosCruce != null) {
					if (beneficiariosCruce.size() > 0) {
						session.setAttribute("Beneficiario", beneficiariosCruce);

						if ((codeDestino != null && !codeDestino.equals("nulo"))
								|| (codeSubDestino != null && !codeSubDestino
										.equals("nulo"))
								|| inclusion.equals("SoloFuente")) {
							objDetCruceVO.setCantidadBeneficiarios(new Long(
									beneficiariosCruce.size()));
						} else {
							objDetCruceVO
									.setCantidadBeneficiarios(repDetCruceServiceImpl
											.findCantidadBeneficiarios(objDetCruceVO));
						}

						objDetCruceVO = repDetCruceServiceImpl
								.findFilters(objDetCruceVO);
						session.setAttribute("Parametros", objDetCruceVO);
					} else {
						session.removeAttribute("Beneficiario");
					}
					objDetCruceVO = null;

				} else {
					session.setAttribute("msg",
							"No hay registros que cumplan con los filtros seleccionados");
					return mapping.findForward("success");
				}
			} catch (DAOException e) {
				SUBException.logDebugError("", e);
			}
		}

		Object obIR = request.getParameter("seleccionar");
		if (obIR == null || accion.equals("BuscarSubprogramas")) {
			return mapping.findForward("success");
		} else {
			return mapping.findForward("ir");
		}
	}
}
